﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ParasitoLibrary.Core.Entidade;
using ParasitoQuestionApplication.Business.Fachada;

namespace ParasitoQuestionApplication.UserInterface
{
    public partial class FormularioEdicaoPergunta : Form
    {

        private Questao questao = null;
        private IList<Questao> listaQuestao = null;
        private EdicaoPerguntaEnum enumOperacao;

        public Questao Questao
        {
            get { return questao; }
            set { questao = value; }
        }

        public IList<Questao> ListaQuestao
        {
            get { return listaQuestao; }
        }

        public EdicaoPerguntaEnum EnumOperacao
        {
            get { return enumOperacao; }
        }
        
        public FormularioEdicaoPergunta(ref IList<Questao> listaQuestao, ref Questao questao, EdicaoPerguntaEnum enumOperacao)
        {
            InitializeComponent();

            this.configurarCBBs();

            this.limparCamposFormulario();

            this.listaQuestao = listaQuestao;
            this.questao = questao;
            this.enumOperacao = enumOperacao;

            switch(this.EnumOperacao)
            {
                case EdicaoPerguntaEnum.Detalhamento :
                    this.configurarFormularioDetalhamento();
                    break;
                case EdicaoPerguntaEnum.Inclusao:
                    this.configurarFormularioInclusao();
                    break;
                case EdicaoPerguntaEnum.Alteracao:
                    this.configurarFormularioAlteracao();
                    break;
                case EdicaoPerguntaEnum.Exclusao:
                    this.configurarFormularioExclusao();
                    break;
            }

        }

        private void preencherFormulario()
        {
            this.cbbNivel.SelectedValue = this.Questao.Nivel.Codigo;
            this.cbbAssunto.SelectedValue = this.Questao.Assunto.Codigo;
            this.lblValorCodigo.Text = this.Questao.Codigo;
            this.txbEnunciado.Text = this.Questao.Enunciado;

            foreach (Resposta resposta in this.Questao.ListaRespostas)
            {
                switch (resposta.Ordem)
                {
                    case 1:
                        this.txbResposta1.Text = resposta.Conteudo;
                        if (resposta.Correta)
                        {
                            this.rdbResposta1.Checked = true;
                        }
                        break;
                    case 2:
                        this.txbResposta2.Text = resposta.Conteudo;
                        if (resposta.Correta)
                        {
                            this.rdbResposta2.Checked = true;
                        }
                        break;
                    case 3:
                        this.txbResposta3.Text = resposta.Conteudo;
                        if (resposta.Correta)
                        {
                            this.rdbResposta3.Checked = true;
                        }
                        break;
                    case 4:
                        this.txbResposta4.Text = resposta.Conteudo;
                        if (resposta.Correta)
                        {
                            this.rdbResposta4.Checked = true;
                        }
                        break;
                    case 5:
                        this.txbResposta5.Text = resposta.Conteudo;
                        if (resposta.Correta)
                        {
                            this.rdbResposta5.Checked = true;
                        }
                        break;
                }
            }
        }

        private void configurarFormularioInclusao()
        {
            this.Text = "Inclusão de Pergunta";

            this.lblCodigo.Visible = false;
            this.lblValorCodigo.Visible = false;
        }

        private void configurarFormularioDetalhamento()
        {
            this.Text = "Visualização de Pergunta";

            this.preencherFormulario();

            this.cbbNivel.Enabled = false;
            this.cbbAssunto.Enabled = false;
            this.txbEnunciado.ReadOnly = true;
            this.txbResposta1.ReadOnly = true;
            this.txbResposta2.ReadOnly = true;
            this.txbResposta3.ReadOnly = true;
            this.txbResposta4.ReadOnly = true;
            this.txbResposta5.ReadOnly = true;
            this.rdbResposta1.Enabled = false;
            this.rdbResposta2.Enabled = false;
            this.rdbResposta3.Enabled = false;
            this.rdbResposta4.Enabled = false;
            this.rdbResposta5.Enabled = false;
            this.btnConfirmar.Visible = false;
            this.btnLimpar.Visible = false;
        }

        private void configurarFormularioAlteracao()
        {
            this.Text = "Edição de Pergunta";

            this.preencherFormulario();
        }

        private void configurarFormularioExclusao()
        {
            this.configurarFormularioDetalhamento();
            this.Text = "Exclusão de Pergunta";
            this.btnConfirmar.Visible = true;
        }

        private void configurarCBBs()
        {
            IList<Nivel> listaNiveis = FachadaParasitoQuestion.getInstancia().carregarNiveis();
            IList<Assunto> listaAssunto = FachadaParasitoQuestion.getInstancia().carregarAssuntos();

            this.cbbNivel.DataSource = listaNiveis;
            this.cbbNivel.DisplayMember = "Nome";
            this.cbbNivel.ValueMember = "Codigo";

            this.cbbAssunto.DataSource = listaAssunto;
            this.cbbAssunto.DisplayMember = "Nome";
            this.cbbAssunto.ValueMember = "Codigo";
        }


        private void limparCamposFormulario()
        {
            this.cbbNivel.SelectedItem = null;
            this.cbbAssunto.SelectedItem = null;
            this.txbEnunciado.Text = "";
            this.txbResposta1.Text = "";
            this.txbResposta2.Text = "";
            this.txbResposta3.Text = "";
            this.txbResposta4.Text = "";
            this.txbResposta5.Text = "";
            this.rdbResposta1.Checked = false;
            this.rdbResposta2.Checked = false;
            this.rdbResposta3.Checked = false;
            this.rdbResposta4.Checked = false;
            this.rdbResposta5.Checked = false;
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            this.limparCamposFormulario();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (!this.enumOperacao.Equals(EdicaoPerguntaEnum.Detalhamento))
            {
                DialogResult dialogResult;
                dialogResult = MessageBox.Show(this,"Deseja cancelar a operação?", "Confirmação de cancelamento", MessageBoxButtons.YesNo);

                if (dialogResult == DialogResult.Yes)
                {
                    this.Close();
                }
            }
            else
            {
                this.Close();
            }
        }        


        private bool isFormularioValido()
        {
            bool valorRetorno = true;

            if (this.cbbNivel.SelectedItem == null)
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário escolher o nível da pergunta.");
            }

            if ( valorRetorno && this.cbbAssunto.SelectedItem == null ) 
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário escolher o Assunto da pergunta.");
            }

            if (valorRetorno && (this.txbEnunciado.Text == null || this.txbEnunciado.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário redigir o enunciado da pergunta.");
            }

            if (valorRetorno && (this.txbResposta1.Text == null || this.txbResposta1.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar o conteúdo da resposta 1.");
            }

            if (valorRetorno && (this.txbResposta2.Text == null || this.txbResposta2.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar o conteúdo da resposta 2.");
            }

            if (valorRetorno && (this.txbResposta3.Text == null || this.txbResposta3.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar o conteúdo da resposta 3.");
            }

            if (valorRetorno && (this.txbResposta4.Text == null || this.txbResposta4.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar o conteúdo da resposta 4.");
            }

            if (valorRetorno && (this.txbResposta5.Text == null || this.txbResposta5.Text.Equals("")))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar o conteúdo da resposta 5.");
            }

            if (valorRetorno && (!this.rdbResposta1.Checked && !this.rdbResposta2.Checked && !this.rdbResposta3.Checked && !this.rdbResposta4.Checked && !this.rdbResposta5.Checked))
            {
                valorRetorno = false;
                MessageBox.Show(this, "É ncessário especificar qual resposta está correta.");
            }

            return valorRetorno;
        }

        private void incluirQuestao()
        {

            if (this.isOperacaoConfirmada())
            {
                this.preencherQuestao();
                FachadaParasitoQuestion.getInstancia().inserirQuestao(this.Questao);
                this.ListaQuestao.Add(this.Questao);

                MessageBox.Show(this, "Pergunta inserida com sucesso!");

                this.Close();
                this.Dispose();
            }
        }

        private void alterarQuestao()
        {
            if (this.isOperacaoConfirmada())
            {
                this.preencherQuestao();
                FachadaParasitoQuestion.getInstancia().alterarQuestao(this.Questao, ref this.listaQuestao);

                MessageBox.Show(this, "Pergunta alterada com sucesso!");

                this.Close();
                this.Dispose();
            }
        }

        private void excluirQuestao()
        {
            if (this.isOperacaoConfirmada())
            {                
                FachadaParasitoQuestion.getInstancia().excluirQuestao(this.Questao, ref this.listaQuestao);

                MessageBox.Show(this, "Pergunta excluída com sucesso!");

                this.Close();
                this.Dispose();
            }
        }

        private void preencherQuestao()
        {
            Resposta resposta = null;

            if (this.EnumOperacao.Equals(EdicaoPerguntaEnum.Inclusao)) {
                this.Questao = new Questao();
            }            
            
            this.Questao.Nivel = (Nivel)this.cbbNivel.SelectedItem;
            this.Questao.Assunto = (Assunto)this.cbbAssunto.SelectedItem;
            this.Questao.Enunciado = this.txbEnunciado.Text;
            this.Questao.ListaRespostas = new List<Resposta>();

            resposta = new Resposta();
            resposta.Conteudo = this.txbResposta1.Text;
            resposta.Correta = this.rdbResposta1.Checked;
            resposta.Ordem = 1;
            this.Questao.ListaRespostas.Add(resposta);

            resposta = new Resposta();
            resposta.Conteudo = this.txbResposta2.Text;
            resposta.Correta = this.rdbResposta2.Checked;
            resposta.Ordem = 2;
            this.Questao.ListaRespostas.Add(resposta);

            resposta = new Resposta();
            resposta.Conteudo = this.txbResposta3.Text;
            resposta.Correta = this.rdbResposta3.Checked;
            resposta.Ordem = 3;
            this.Questao.ListaRespostas.Add(resposta);

            resposta = new Resposta();
            resposta.Conteudo = this.txbResposta4.Text;
            resposta.Correta = this.rdbResposta4.Checked;
            resposta.Ordem = 4;
            this.Questao.ListaRespostas.Add(resposta);

            resposta = new Resposta();
            resposta.Conteudo = this.txbResposta5.Text;
            resposta.Correta = this.rdbResposta5.Checked;
            resposta.Ordem = 5;
            this.Questao.ListaRespostas.Add(resposta);
        }

        private Boolean isOperacaoConfirmada()
        {
            Boolean valorRetorno = false;

            DialogResult dialogResult;
            dialogResult = MessageBox.Show(this, "Deseja confirmar a operação?", "Confirmação", MessageBoxButtons.YesNo);

            if (dialogResult == DialogResult.Yes)
            {
                valorRetorno = true;
            }
            else
            {
                valorRetorno = false;
            }

            return valorRetorno;
        }

        private void btnConfirmar_Click(object sender, EventArgs e)
        {
            if (this.isFormularioValido())
            {
                if (this.EnumOperacao.Equals(EdicaoPerguntaEnum.Inclusao))
                {
                    this.incluirQuestao();
                }
                else if (this.EnumOperacao.Equals(EdicaoPerguntaEnum.Alteracao))
                {
                    this.alterarQuestao();
                }
                else if (this.EnumOperacao.Equals(EdicaoPerguntaEnum.Exclusao))
                {
                    this.excluirQuestao();
                }
            }
        }


    }
}
